package sys

import (
	"errors"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"menu-generation-go/database"
	"menu-generation-go/handlers/common"
	"menu-generation-go/models"
	"time"
)

type MenuUserHandler struct {
	DB *database.Database
}

func NewMenuUserHandler(db *database.Database) *MenuUserHandler {
	return &MenuUserHandler{DB: db}
}

// GetUserInfo 获取用户信息
// @Summary 获取用户信息
// @Description 根据用户ID获取用户详细信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id query int true "用户ID"
// @Success 200 {object} utils.Response{data=models.MenuUser}
// @Router /api/user/info [get]
func (h *MenuUserHandler) GetUserInfo(c *gin.Context) {
	session, err := common.GetUserSession(c)
	if err != nil {
		common.SendErrJSON(err.Error(), c)
		return
	}
	var user models.MenuUser
	result := h.DB.GetDB().Where("id = ?", session.UserID).First(&user)

	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			common.SendErrJSON("用户不存在", c)
		} else {
			common.SendErrJSON("获取用户信息失败", c)
		}
		return
	}

	// 隐藏敏感信息
	user.Password = ""
	user.Salt = ""

	common.Ok(c, user)
}

// UpdateUserInfo 修改用户信息
// @Summary 修改用户信息
// @Description 修改用户基本信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param user body models.MenuUser true "用户信息"
// @Success 200 {object} utils.Response
// @Router /api/user/update [put]
func (h *MenuUserHandler) UpdateUserInfo(c *gin.Context) {
	var user models.MenuUser
	if err := c.ShouldBindJSON(&user); err != nil {
		common.SendErrJSON("参数解析失败", c)
		return
	}

	if user.ID == 0 {
		common.SendErrJSON("用户ID不能为空", c)
		return
	}

	// 检查用户是否存在
	var existingUser models.MenuUser
	result := h.DB.GetDB().Where("id = ?", user.ID).First(&existingUser)
	if result.Error != nil {
		common.SendErrJSON("用户不存在", c)
		return
	}

	// 构建更新字段，排除不允许更新的字段
	updateData := map[string]interface{}{
		"nick_name":  user.NickName,
		"avatar":     user.Avatar,
		"gender":     user.Gender,
		"remark":     user.Remark,
		"status":     user.Status,
		"floor":      user.Floor,
		"updated_at": time.Now(),
	}

	result = h.DB.GetDB().Model(&models.MenuUser{}).
		Where("id = ?", user.ID).
		Updates(updateData)

	if result.Error != nil {
		common.SendErrJSON("更新用户信息失败", c)
		return
	}

	if result.RowsAffected == 0 {
		common.SendErrJSON("用户信息未发生变化", c)
		return
	}

	common.Ok(c, "更新成功")
}
